/**
 * @file usbip_defs.h
 * @brief USBIP协议定义头文件（Simple modification）
 * @version 0.1
 * @date 2020-01-22
 *
 * @copyright Copyright (c) 2020
 *
 */

// 重点关注以下结构体：
// usbip_stage2_header
// usbip_stage1_response_devlist

//
// Created by thevoidnn on 10/25/17.  // 原始创建信息
//

#ifndef __USBIP_DEFS_H__ // 防止头文件重复包含
#define __USBIP_DEFS_H__

#include <stdint.h> // 标准整数类型头文件

#include "usb_defs.h" // USB基础定义头文件

#define USBIP_SYSFS_PATH_SIZE 256 // sysfs路径最大长度
#define USBIP_BUSID_SIZE 32       // 总线ID最大长度

// 阶段1命令枚举（偏移量2）
enum usbip_stage1_command
{
    USBIP_STAGE1_CMD_DEVICE_LIST = 0x05,   // 请求设备列表（OP_REQ_DEVLIST）
    USBIP_STAGE1_CMD_DEVICE_ATTACH = 0x03, // 请求附加设备（OP_REQ_IMPORT）
};

// 阶段2命令枚举（偏移量0）
enum usbip_stager2_command
{
    USBIP_STAGE2_REQ_SUBMIT = 0x0001, // 提交请求
    USBIP_STAGE2_REQ_UNLINK = 0x0002, // 取消链接请求
    USBIP_STAGE2_RSP_SUBMIT = 0x0003, // 提交响应
    USBIP_STAGE2_RSP_UNLINK = 0x0004, // 取消链接响应
};

// 传输方向枚举
enum usbip_stage2_direction
{
    USBIP_DIR_OUT = 0x00, // 输出方向
    USBIP_DIR_IN = 0x01,  // 输入方向
};

// 阶段1协议头结构体（打包对齐）
typedef struct
{
    uint16_t version; // 协议版本
    uint16_t command; // 命令类型
    uint32_t status;  // 状态码
} __attribute__((__packed__)) usbip_stage1_header;
/////////////////////////////////////////////////////////////

// USB设备描述结构体（打包对齐）
typedef struct
{
    char path[USBIP_SYSFS_PATH_SIZE]; // 设备sysfs路径
    char busid[USBIP_BUSID_SIZE];     // 设备总线ID

    uint32_t busnum; // 总线号
    uint32_t devnum; // 设备号
    uint32_t speed;  // 设备速度

    uint16_t idVendor;  // 厂商ID
    uint16_t idProduct; // 产品ID
    uint16_t bcdDevice; // 设备版本号

    uint8_t bDeviceClass;    // 设备类
    uint8_t bDeviceSubClass; // 设备子类
    uint8_t bDeviceProtocol; // 设备协议

    uint8_t bConfigurationValue; // 当前配置值
    uint8_t bNumConfigurations;  // 配置数量
    uint8_t bNumInterfaces;      // 接口数量
} __attribute__((packed)) usbip_stage1_usb_device;

// USB接口描述结构体（打包对齐）
typedef struct
{
    uint8_t bInterfaceClass;    // 接口类
    uint8_t bInterfaceSubClass; // 接口子类
    uint8_t bInterfaceProtocol; // 接口协议
    uint8_t padding;            // 填充字节
} __attribute__((packed)) usbip_stage1_usb_interface;

// 设备列表条目结构体（包含设备和接口信息）
typedef struct
{
    usbip_stage1_usb_device udev;      // USB设备描述
    usbip_stage1_usb_interface uinf[]; // USB接口描述数组
} __attribute__((packed)) usbip_stage1_response_devlist_entry;

// 设备列表响应结构体（打包对齐）
typedef struct
{
    uint32_t list_size;                            // 设备列表大小
    usbip_stage1_response_devlist_entry devices[]; // 设备列表条目数组
} __attribute__((__packed__)) usbip_stage1_response_devlist;

///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////

/**
 * struct usbip_header_basic - 所有URB请求的基础头（响应和请求共用）
 * @command: USBIP请求类型
 * @seqnum: 序列号，用于标识请求；每个连接递增
 * @devid: 唯一标识远程USB设备（替代busnum和devnum）；
 *         在存根驱动中，该值为((busnum << 16) | devnum)
 * @direction: 传输方向
 * @ep: 端点号
 */
typedef struct
{
    uint32_t command;   // 命令类型
    uint32_t seqnum;    // 序列号
    uint32_t devid;     // 设备ID
    uint32_t direction; // 传输方向
    uint32_t ep;        // 端点号
} __attribute__((packed)) usbip_stage2_header_basic;

/**
 * struct usbip_header_cmd_submit - USBIP_CMD_SUBMIT包头部（请求）
 * @transfer_flags: URB标志
 * @transfer_buffer_length: 传输数据长度（输入或输出）
 * @start_frame: 等时或中断传输的初始帧
 * @number_of_packets: 等时包数量
 * @interval: 服务端主机控制器的最大请求时间
 * @setup: 控制请求的setup数据
 */
typedef struct
{
    uint32_t transfer_flags; // 传输标志
    int32_t data_length;     // 数据长度

    /* 对usbip同步帧较难（保留字段？） */
    int32_t start_frame;       // 起始帧
    int32_t number_of_packets; // 包数量
    int32_t interval;          // 间隔时间

    union
    {
        uint8_t setup[8];             // 控制请求的8字节setup数据
        usb_standard_request request; // 标准USB请求结构体
    };
} __attribute__((packed)) usbip_stage2_header_cmd_submit;

/**
 * struct usbip_header_ret_submit - USBIP_RET_SUBMIT包头部（响应）
 * @status: 非等时请求的返回状态
 * @actual_length: 实际传输的字节数
 * @start_frame: 等时或中断传输的初始帧
 * @number_of_packets: 等时包数量
 * @error_count: 等时传输的错误计数
 */
typedef struct
{
    int32_t status;            // 状态码
    int32_t data_length;       // 实际数据长度
    int32_t start_frame;       // 起始帧
    int32_t number_of_packets; // 包数量
    int32_t error_count;       // 错误计数
} __attribute__((packed)) usbip_stage2_header_ret_submit;

/**
 * struct usbip_header_cmd_unlink - USBIP_CMD_UNLINK包头部（请求）
 * @seqnum: 要取消链接的URB序列号
 */
typedef struct
{
    uint32_t seqnum; // 目标URB序列号
} __attribute__((packed)) usbip_stage2_header_cmd_unlink;

/**
 * struct usbip_header_ret_unlink - USBIP_RET_UNLINK包头部（响应）
 * @status: 请求的返回状态
 * @padding: 填充字节（Linux专用，usbip-win忽略此字段）
 */
typedef struct
{
    int32_t status;      // 状态码
    uint8_t padding[24]; // 24字节填充（仅Linux使用）
} __attribute__((packed)) usbip_stage2_header_ret_unlink;

/**
 * struct usbip_header - 所有usbip数据包的通用头部
 * @base: 基础头部
 * @u: 根据包类型选择的具体头部（联合体）
 */
typedef struct
{
    usbip_stage2_header_basic base; // 基础头部

    union
    {
        usbip_stage2_header_cmd_submit cmd_submit; // 提交请求头部
        usbip_stage2_header_ret_submit ret_submit; // 提交响应头部
        usbip_stage2_header_cmd_unlink cmd_unlink; // 取消链接请求头部
        usbip_stage2_header_ret_unlink ret_unlink; // 取消链接响应头部
    } u;
} __attribute__((packed)) usbip_stage2_header;

#endif // 结束头文件定义